#ifndef DELAUNAY_H
#define DELAUNAY_H

#include <vector>
#include <optional>
#include <functional>

struct Point {
    double x, y;
    Point();
    Point(double x, double y);
};

// 重心坐标结构体
struct BarycentricCoords {
    double u, v;
    BarycentricCoords(double u, double v) : u(u), v(v) {}
};

// 德劳内三角剖分主函数
// vertices: 顶点数组
// vertexProcessor: 可选的顶点处理器函数，用于从复杂对象中提取顶点
std::vector<int> triangulate(
    std::vector<Point> vertices,
    std::optional<std::function<Point(const Point&)>> vertexProcessor = std::nullopt
);
extern "C" std::vector<int> triangulate(const float* coords, size_t num_points, bool (*progress_callback)(float) = nullptr);

// 检查点是否在三角形内
// tri: 三角形的三个顶点
// p: 要检查的点
// 返回: 如果点在三角形内，返回重心坐标；否则返回空
std::optional<BarycentricCoords> contains(const std::vector<Point>& tri, const Point& p);

#endif // DELAUNAY_H